package com.sfx.concurrent.demo.concurrent.TestWaitNotify;

import lombok.extern.slf4j.Slf4j;

/**
 * 缺点 :
 * 其它干活的线程，都要一直阻塞，效率太低
 * 小南线程必须睡足 2s 后才能醒来，就算烟提前送到，也无法立刻醒来
 * 加了 synchronized (room) 后，就好比小南在里面反锁了门睡觉，烟根本没法送进门，main 没加
 * synchronized 就好像 main 线程是翻窗户进来的
 * 解决方法，使用 wait - notify 机制
 */
@Slf4j(topic = "c.TestWaitNotify1")
public class TestWaitNotify1 {
    private static final Object room = new Object();
    private static boolean isCigarette = false;
    public static void main(String[] args) throws InterruptedException {
        //小南等烟
        new Thread(()->{
            synchronized (room) {
                log.debug("是否有香烟 : " +isCigarette);
                if(!isCigarette){
                    log.debug("没有香烟,干不了活,等一会(2s)");
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                log.debug("是否有香烟 : " +isCigarette);
                if(isCigarette){
                    log.debug("小南开始干活");
                }
            }
        },"小南").start();

        //还有5个人也要去房间干活
        for(int i =0;i<5;++i){
            new Thread(()->{
               synchronized (room){
                   log.debug("开始干活");
               }
            },"其他人" + i).start();
        }

        Thread.sleep(1000);
        //还有一个线程来送烟
        new Thread(()->{
            synchronized (room){
                isCigarette = true;
                log.debug("送烟送到了");
            }
        },"送烟的").start();
    }
}